#include "vec3.h"
#include <math.h>


vec3::vec3() : X(0)
,Y(0)
,Z(0)
{
}

vec3::vec3(float x, float y, float z) : X(x)
,Y(y)
,Z(z)
{

}

vec3::vec3(const vec3& o) : X(o.X)
,Y(o.Y)
,Z(o.Z)
{

}

vec3 vec3::operator +(vec3 o)
{
    vec3 r(X + o.X, Y + o.Y, Z + o.Z);
    return r;
}

vec3 vec3::operator -(vec3 o)
{
    vec3 r(X - o.X, Y - o.Y, Z - o.Z);
    return r;
}

vec3 vec3::operator *(float f)
{
    vec3 r(X * f, Y * f, Z * f);
    return r;
}

void vec3::operator =(vec3 o)
{
    X = o.X;
    Y = o.Y;
    Z = o.Z;
}

void vec3::operator +=(vec3 o)
{
    X += o.X;
    Y += o.Y;
    Z += o.Z;
}

void vec3::operator -=(vec3 o)
{
    X -= o.X;
    Y -= o.Y;
    Z -= o.Z;
}

void vec3::operator *=(float f)
{
    X *= f;
    Y *= f;
    Z *= f;
}

bool vec3::IsZero()
{
    return X == 0.f && Y == 0.f && Z == 0.f;
}

float vec3::Length()
{
    float r = X * X + Y * Y + Z * Z;
    return sqrt(r);
}

void vec3::Normalize()
{
    float length = Length();
    if(length > 0)
    {
        X /= length;
        Y /= length;
        Z /= length;
    }
}

float vec3::Dot(vec3 o)
{
    float r = X * o.X + Y * o.Y + Z * o.Z;
    return r;
}

vec3 vec3::Cross(vec3 o)
{
    vec3 r(Y * o.Z - Z * o.Y, Z * o.X - X * o.Z, X * o.Y - Y * o.X);
    return r;
}
